/*
 * @file: 面包屑路径状态模块
 * @author: haojw1
 */

/**
 * 获取sessionStorage中存储的面包屑路径数组信息
 * @return {Array} sessionStorage中存储的面包屑路径数组信息
 */
const getBreadcrumbs = () => JSON.parse(sessionStorage.getItem('breadcrumbs'));
/**
 * 获取sessionStorage中存储的面包屑路径数组信息
 * @params {Array} 需要存储到sessionStorage中的面包屑路径数组信息
 */
const setBreadcrumbsToSessionStorage = breadcrumbs => sessionStorage.setItem('breadcrumbs', JSON.stringify(breadcrumbs));

const state = {
  // 面包屑路径数组
  breadcrumbs: getBreadcrumbs()
};

const mutations = {
  /**
   * @param {Object} states 当前vuex模块中的state对象
   * @param {Array} newBreadcrumbs
   */
  SET_BREADCRUMBS(states, newBreadcrumbs) {
    // 为面包屑路径数组添加新的面包屑
    // 添加抑制原因：vuex 状态管理要求，需要将传入的对象stats进行修改
    // eslint-disable-next-line no-param-reassign
    states.breadcrumbs = [...newBreadcrumbs];
    // 将新的面包屑数组存入到sessionStorage中
    setBreadcrumbsToSessionStorage(states.breadcrumbs);
  },
  SET_NEW_BREADCRUMBS(states, newBreadcrumbs) {
    // 为面包屑路径数组添加新的面包屑
    // 添加抑制原因：vuex 状态管理要求，需要将传入的对象stats进行修改
    // eslint-disable-next-line no-param-reassign
    states.breadcrumbs = [...states.breadcrumbs, ...newBreadcrumbs];
    // 将新的面包屑数组存入到sessionStorage中
    setBreadcrumbsToSessionStorage(states.breadcrumbs);
  }
};

const actions = {
  /**
   * 根据传入的新面包屑路径数组,去重后添加到 面包屑路径状态中
   * @param {Array} newBreadcrumbs 新面包屑路径数组
   */
  addBreadcrumb(context, newBreadcrumbs) {
    let newBreadcrumbList = [...newBreadcrumbs];
    // 定义过滤重复数据的方法
    const filterFuntion = it => context.state.breadcrumbs.findIndex(
      item => it.name === item.name && it.to === item.to
    ) === -1;
    // 过滤掉新面包屑路径数组中与已有面包屑重复的部分
    newBreadcrumbList = newBreadcrumbList.filter(filterFuntion);
    context.commit('SET_NEW_BREADCRUMBS', newBreadcrumbList);
  }
};

export default {
  namespaced: true,
  state,
  mutations,
  actions
};
